package com.itheima.filter;


import com.alibaba.fastjson.JSONObject;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * CTassName: longChecFiletr
 * Package: com.itheima.filter
 * Description:
 * 拦截器
 *
 * @WebFilter注解 拦截请求
 * @Author xw
 * @Create 2023/11/7 17:10
 * @Version 1.0
 */

@Slf4j
@WebFilter(urlPatterns = "/*")  // 拦截请求
public class longChecFiletr implements Filter {

    // 拦截到请求之后调用， 调用多次
    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {

        // 前置：强制转换为 http 协议的请求对象、响应对象 （转换原因：要使用子类中特有方法）

        // 该对象用于获取客户端发送给服务器的HTTP请求的信息
        HttpServletRequest request = (HttpServletRequest) servletRequest;


        // 该对象用于向客户端发送HTTP响应
        HttpServletResponse response = (HttpServletResponse) servletResponse;


        // 拿到请求路径
        String url = request.getRequestURL().toString();

        // 日志
        log.info("请求路径：{}", url); //请求路径：http://localhost:8080/login

        // 判断是否包含 long 请求路径
        if (url.contains("/login")) {
            // 放行
            log.info("登录操作放行");
            filterChain.doFilter(request, response); //放行请求
            return;
        }


        // 获取请求头 token
        String token = request.getHeader("token");
        log.info("从请求头中获取的令牌：{}", token);

        // 判断令牌是否存在，如果不存在，返回错误结果（未登录）
        if (!StringUtils.hasLength(token)) {
            log.info("token不存在：{}");

            // 返回为登录的信息
            Result responseResult = Result.error("NOT_LOGIN");

            //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
            String json = JSONObject.toJSONString(responseResult);
            response.setContentType("application/json;charset=utf-8");

            //响应
            response.getWriter().write(json);
            return;
        }


        // 解析 token 是否有效
        try {
            JwtUtils.parseJWT(token);
        } catch (Exception e) {
            log.info("令牌解析失败!");

            // 返回为登录的信息
            Result responseResult = Result.error("NOT_LOGIN");

            //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
            String json = JSONObject.toJSONString(responseResult);
            response.setContentType("application/json;charset=utf-8");

            //响应
            response.getWriter().write(json);
            return;
        }


        log.info("令牌解析成功!  (*^▽^*)");
        filterChain.doFilter(request, response); //放行请求
    }

}
